package com.lzy.service.impl;

import com.lzy.common.CommonResult;
import com.lzy.common.ConstantResult;
import com.lzy.entity.Message;
import com.lzy.service.PublisherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.UUID;

/**
 * @author: liuzhongyu
 * @date: 2021/10/17 15:55
 * @desc:
 */
@Service
public class PublisherServiceImpl implements PublisherService {

    @Autowired
    private RedisTemplate<String, Message> redisTemplate;


    /**
     * 发送消息到redis频道供订阅。注意：使用redis客户端redis-cli登录订阅查看的中文内容是以16进制的形式
     *      表示的，若要查看中文字符，需要在连接时强制原始输出 redis-cli -h localhost -p 6379 --raw
     *      然后再使用命令订阅频道     subscribe system
     * @param message 消息对象
     * @return
     */
    @Override
    public CommonResult pubMsg(Message message) {
        //返回结果
        CommonResult result = null;
        if (null != message){
            //补全消息实体
            if (StringUtils.isEmpty(message.getId())){  //如果为传id则生成并返回
                message.setId(UUID.randomUUID().toString());
            }
            message.setCreateTime(new Date());
            message.setUpdateTime(new Date());
            try{
                redisTemplate.convertAndSend(message.getType(), message);    //往指定频道发布消息
                //redisTemplate.opsForList().leftPush(message.getType(), message);    //采用队列的形式发布到redis
                System.out.println("消息发布到redis队列频道：" + message.getType() + "成功！");
                result = new CommonResult<Message>(ConstantResult.SUCCESS_CODE, "消息发布到" + message.getType() + "频道成功！", message);
            }catch (Exception e){
                e.printStackTrace();
                result = new CommonResult<Message>(ConstantResult.FAIL_CODE, "消息发布到" + message.getType() + "频道失败！", message);
            }
        }

        return result;
    }
}
